home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 431_01 / ifs0.asm < prev    next >
Assembly Source File  |  1994-10-07  |  6KB  |  285 lines

  1. ;----------------------------------------------------------------------
  2. ;----------------------------------------------------------------------
  3. ;
  4. ; IFS client module assembly stubs
  5. ;
  6. ;----------------------------------------------------------------------
  7. ;----------------------------------------------------------------------
  8. IFS0_TEXT    segment    byte public 'CODE'
  9. DGROUP    group    _DATA,_BSS
  10.     assume    cs:IFS0_TEXT,ds:DGROUP
  11. IFS0_TEXT    ends
  12.  
  13. _DATA    segment word public 'DATA'
  14. d@    label    byte
  15. d@w    label    word
  16.  
  17. userintno    db    ?
  18.  
  19. STK1LEN     equ    512
  20. stk1        db    STK1LEN dup (0)
  21. stk1end        equ    $
  22. stk1sav        dd    ?
  23.  
  24. STK2LEN     equ    512
  25. stk2        db    STK2LEN dup (0)
  26. stk2end        equ    $
  27. stk2sav        dd    ?
  28.  
  29. _DATA    ends
  30.  
  31. _BSS    segment word public 'BSS'
  32. b@    label    byte
  33. b@w    label    word
  34. _BSS    ends
  35.  
  36. extrn    _dispatch:far
  37. extrn    _UserInt:far
  38. extrn    _Intr17:far
  39.  
  40. public  _ifs0_init
  41. public  _ifs0_shutdown
  42. public  _ifs0_GetStackUsed
  43.  
  44. IFS0_TEXT    segment    byte public 'CODE'
  45.  
  46. _oldint2f    dd    ?
  47. _olduser    dd    ?
  48.  
  49. ;------------------------------------------------------------
  50. ; void far ifs0_init(unsigned itr)
  51. ;   install our IFS hook. set user communications hook to 
  52. ;   [itr]
  53. ;------------------------------------------------------------
  54. _ifs0_init    proc    far
  55.         push    bp            ; standard entry 
  56.         mov    bp,sp
  57.         mov    ax,[bp+6]        ; ax = itr
  58.         mov    [userintno],al
  59.         mov    ax,352fh        ; get Multiplex int.
  60.         int    21h
  61.         mov word ptr cs:[_oldint2f], bx
  62.         mov word ptr cs:[_oldint2f+2], es
  63.         
  64.         mov    ah,35h            ; get user hook
  65.         mov    al,[userintno]
  66.         int    21H
  67.         mov word ptr cs:[_olduser], bx
  68.         mov word ptr cs:[_olduser+2], es
  69.         
  70.         mov    bl,[userintno]        ; bl = user int #
  71.         push    ds            ; set our hooks
  72.         push    cs
  73.         pop    ds
  74.         mov    dx, offset _ifs0
  75.         mov    ax,252fh
  76.         int    21h
  77.         
  78.         mov    dx, offset _ifs0_user
  79.         mov    ah,25h
  80.         mov    al,bl
  81.         int    21h
  82.  
  83.         mov    ax,3517h
  84.         int    21h
  85.         mov word ptr cs:[_old17], bx
  86.         mov word ptr cs:[_old17+2], es
  87.         
  88.         mov    dx, offset _new17
  89.         mov    ax,2517h
  90.         int    21h
  91.         
  92.         pop    ds
  93.         pop    bp
  94.         ret
  95. _ifs0_init    endp
  96.  
  97. ;------------------------------------------------------------
  98. ; void far ifs0_shutdown(void)
  99. ;    restore intecepted ints
  100. ;------------------------------------------------------------
  101. _ifs0_shutdown    proc    far
  102.         mov    al,[userintno]
  103.         push    ds            ; restore orig. hooks
  104.         lds    dx, cs:[_olduser]
  105.         mov    ah, 25h
  106.         int    21h
  107.         
  108.         lds    dx, cs:[_oldint2f]
  109.         mov    ax, 252fh
  110.         int    21h
  111.  
  112.         lds    dx, cs:[_old17]
  113.         mov    ax, 2517h
  114.         int    21h
  115.         
  116.         pop    ds
  117.         ret
  118. _ifs0_shutdown    endp
  119.  
  120. here        db    0        ; i doubt this is necessary
  121.                     ; but better safe than sorry :)
  122. _ifs0           proc far
  123.         push    ax
  124.         cmp    cs:[here],0    ; are we already here?
  125.         jnz    @@notus        ; yes, exit
  126.         mov    cs:[here],1    ; set sem.
  127.         push    bx        ; save remaining registers
  128.         push    cx
  129.         push    dx
  130.         push    si
  131.         push    di
  132.         push    ds
  133.         push    es
  134.         push    bp
  135.         mov    bp,DGROUP        ; set ds --> DGROUP
  136.         mov    ds,bp
  137.         mov word ptr [stk1sav],sp    ; save caller's stack
  138.         mov word ptr [stk1sav+2],ss
  139.         cli
  140.         mov    ss,bp            ; set to local stack
  141.         mov    sp,offset stk1end
  142.         sti
  143.         push word ptr [stk1sav+2]    ; push old ss/sp
  144.         push word ptr [stk1sav]
  145.         call    _dispatch        ; dispatch routine
  146.         cli
  147.         mov    sp, word ptr [stk1sav]    ; retrieve original ss/sp
  148.         mov    ss, word ptr [stk1sav+2]
  149.         
  150.         pop    bp            ; restore regs
  151.         pop    es            ; (these can be / are 
  152.         pop    ds            ;  modified by the service
  153.         pop    di            ;  routine)
  154.         pop    si
  155.         pop    dx
  156.         pop    cx
  157.         pop    bx
  158.         mov    cs:[here],0        ; reset sem. flag
  159.         ;
  160.         ; possible return values in AX:
  161.         ;   0xffff == not us, chain
  162.         ;   0x0000 == no error return
  163.         ;   other  == error return, set carry
  164.         ;
  165.         cmp    ax,0ffffh        ; our `not us flag'
  166.         jz    @@notus
  167.         or    ah,ah
  168.         jz    @@finish1
  169.         stc
  170. @@finish1:
  171.         sti
  172.         pop    ax
  173.         ret    2
  174. @@notus:
  175.         pop    ax
  176.         jmp    cs:[_oldint2f]
  177. _ifs0        endp
  178.  
  179.  
  180. ;----------------------------------------------------------------------
  181. ; unsigned ifs0_GetStackUsed(void)
  182. ;  return number of bytes in local stack which were used
  183. ;  used for debugging to minimize stack. i left lot's of space
  184. ;  just in case.
  185. ;----------------------------------------------------------------------
  186. _ifs0_GetStackUsed proc far
  187.         mov     bx,offset stk1
  188.         mov    cx,STK1LEN
  189. @@ifs0_gsu:
  190.         cmp byte ptr [bx],0
  191.         jnz    @@ifs0_gsur
  192.         inc    bx
  193.         loop    @@ifs0_gsu
  194. @@ifs0_gsur:
  195.         sub    bx,offset stk1
  196.         mov    ax,STK1LEN
  197.         sub    ax,bx
  198.         ret
  199.  
  200. _ifs0_GetStackUsed endp
  201.         
  202. ;------------------------------------------------------------
  203. ; our user communications hook
  204. ;------------------------------------------------------------
  205.         db    'RIFS'
  206. _ifs0_user    proc    far
  207.         push    ax        ; save all regs
  208.         push    bx
  209.         push    cx
  210.         push    dx
  211.         push    di
  212.         push    si
  213.         push    ds
  214.         push    es
  215.         push    bp
  216.         mov    bp,DGROUP    ; init DS
  217.         mov    ds,bp
  218.         mov    bp,sp
  219.         push    ss        ; push INTREGS *
  220.         push    bp
  221.         call    _UserInt    ; execute user interrupt
  222.         add    sp,4        ; and return
  223.         pop    bp
  224.         pop    es
  225.         pop    ds
  226.         pop    si
  227.         pop    di
  228.         pop    dx
  229.         pop    cx
  230.         pop    bx
  231.         pop    ax
  232.         iret
  233. _ifs0_user    endp
  234.  
  235. _old17        dd    0
  236. _new17        proc    far
  237.         push    ax
  238.         cmp    cs:[here],0    ; are we already here?
  239.         jnz    @@notus        ; yes, exit
  240.         mov    cs:[here],1    ; set sem.
  241.         push    bx        ; save remaining registers
  242.         push    cx
  243.         push    dx
  244.         push    si
  245.         push    di
  246.         push    ds
  247.         push    es
  248.         push    bp
  249.         mov    bp,DGROUP        ; set ds --> DGROUP
  250.         mov    ds,bp
  251.         mov word ptr [stk1sav],sp    ; save caller's stack
  252.         mov word ptr [stk1sav+2],ss
  253.         cli
  254.         mov    ss,bp            ; set to local stack
  255.         mov    sp,offset stk1end
  256.         sti
  257.         push word ptr [stk1sav+2]    ; push old ss/sp
  258.         push word ptr [stk1sav]
  259.         call    _Intr17          ; dispatch routine
  260.         cli
  261.         mov    sp, word ptr [stk1sav]    ; retrieve original ss/sp
  262.         mov    ss, word ptr [stk1sav+2]
  263.         
  264.         pop    bp            ; restore regs
  265.         pop    es            ; (these can be / are 
  266.         pop    ds            ;  modified by the service
  267.         pop    di            ;  routine)
  268.         pop    si
  269.         pop    dx
  270.         pop    cx
  271.         pop    bx
  272.         mov    cs:[here],0        ; reset sem. flag
  273.         cmp    ax,1
  274.         jz    @@okret
  275.         pop    ax
  276.         jmp     cs:[_old17]
  277. @@okret:
  278.         pop    ax
  279.         iret
  280. _new17        endp
  281.  
  282. IFS0_TEXT    ends
  283.         end
  284.         
  285.